<?php

namespace Ipartek\BlogBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class CategoriaControllerTest extends WebTestCase
{
	private $em;
	//$this->em->getRepository('UsuarioBundle:Usuario')
	
	 
	/**
	 * {@inheritDoc}
	 */
	public function setup(){
	
		$kernel = static::createKernel();
		$kernel->boot();
		$this->em = $kernel->getContainer()->get('doctrine')->getManager();
	}
	
	/**
	 * {@inheritDoc}
	 */
	protected function tearDown()
	{
		parent::tearDown();
		$this->em->close();
	}
	
	/**
	 * Pagina de BienVenida /blog/
	 */
    public function testWelcomePage()
    {
        
    	$client = static::createClient();
        $crawler = $client->request('GET', '/blog/');
        $this->assertEquals(200, $client->getResponse()->getStatusCode(),'La portada se genera correctamente.');
        
    }
    
    /**
     *  tiempo de carrga de la portada infeior a 500 ms
     
    public function testWelcomePageLoadTime()
    {    
    	$client = static::createClient();
    	// Enable the profiler for the next request (it does nothing if the profiler is not available)
    	$client->enableProfiler();    	
    	$client->request('GET', '/blog/');
     	$profiler = $client->getProfile() ;
     	$loadTime = $profiler->getCollector('time')->getDuration();        
        $this->assertLessThan(500, $loadTime,'La portada se genera en MAS de medio segundo'        );
           
    }
    */
    
    /**
     * Prueba que haya menos de 10 noticias en la portada
     */
    public function testNoticiasPortada(){
    	$client = static::createClient();
    	// Enable the profiler for the next request (it does nothing if the profiler is not available)
    	$client->enableProfiler();
    	
    	$client->request('GET', '/blog/');    	
    	 // Check that the profiler is enabled
        $profile = $client->getProfile(); 
            // check the number of requests
            $this->assertLessThan(
                11,
                $profile->getCollector('db')->getQueryCount(),
            	'No se deben mostrar mas de 10 noticias en la HOME'	
            );
        
    }
    /**
     * Prueba que funcione la URL del detalle de la noticia numero X
     */
    public function testUrlDetalleNoticia($id=17){    	
    	$this->assertTrue($this->checkUrlDetalleNoticia($id), "No existe detalle para la noticia=".$id);    	
    }
    
  

    /**
     * Prueba que Existe almenos una categoria
     */
    public function testCategorias(){
    	$categorias = $this->em->getRepository('IpartekBlogBundle:Categoria')->findAll();    	
    	$this->assertGreaterThan(0, sizeof($categorias) , 'Existe almenos una categoria');
    }
    
    /**
     * Prueba que Existe almenos una Noticia por categoria
     */
    public function testCategoriasNoticias(){
    	$resul = true;
    	$catName= "ninguna"; //nombre de la Categoria que falta noticia
    	$categorias = $this->em->getRepository('IpartekBlogBundle:Categoria')->findAll();
    	foreach ( $categorias as $cat ){
    		$noticias = $cat->getNoticias();
    		if ( sizeof($noticias) <= 0 ){
    			$resul=false;
    			$catName= $cat->getNombre();
    		}    		
    	}
    	$this->assertTrue( $resul , 'Categoria ['.$catName.'] debe tener al menos una noticia');
    }
    
    /**
     * Prueba que todas las noticias se cargen en su layout de detalle
     *
    public function testTodasNoticias(){
    	$resul = true;
    	$idNoticia= "ninguna"; //nombre de la Categoria que falta noticia
    	$categorias = $this->em->getRepository('IpartekBlogBundle:Categoria')->findAll();
    	foreach ( $categorias as $cat ){
    		$noticias = $cat->getNoticias();
    		foreach ($noticias as $noticia){
	    		if ( !$this->checkUrlDetalleNoticia( $noticia->getId()) ){
	    			$resul=false;
	    			$idNoticia= $noticia->getID();
	    		}
    		}	
    	}
    	$this->assertTrue( $resul , 'La noticia ['.$idNoticia.'] no puede cargar su layout de detalle');
    }
    */
    
    
    /**
     * Prueba que todas las noticias se cargen con una foto que no sea por defecto
     */
    public function testImagenPorDefecto(){
    	$resul = true;    	
    	$idNoticia= "ninguna"; //nombre de la Categoria que falta noticia
    	$categorias = $this->em->getRepository('IpartekBlogBundle:Categoria')->findAll();
    	foreach ( $categorias as $cat ){
    		$noticias = $cat->getNoticias();
    		foreach ($noticias as $noticia){
    			if ( $this->checkSinFoto( $noticia->getId()) ){
    				$resul=false;
    				$idNoticia= $noticia->getID();
    			}
    		}
    	}
    	$this->assertTrue( $resul , 'La noticia ['.$idNoticia.'] no tiene foto asociada');
    }
    
    /**
     * Cehckea si existe la foto por defecto para una noticia
     * @param unknown $id noticia
     * @return boolean true si encuentra la foto por defecto $img_default
     */
    private function checkSinFoto ($id){
    	$img_default= "/bundles/ipartekblog/images/sin-noticia.jpg";
    	$client = static::createClient();    	
    	$crawler = $client->request('GET', 'blog/mostrar/'.$id);
    	$img_src = $crawler->filter('img.foto_detalle ')->attr('src');
    	//var_dump($img_src);
    	if ( $img_src == $img_default ){
    		return true;
    	}else{
    		return false;
    	}	
    		
    }
    
    /**
     * Checkea si existe el detalle de un noticia
     * @param unknown $id Noticia
     * @return boolean si StatusCode == 200
     */
    private function checkUrlDetalleNoticia($id){
    	$client = static::createClient();
    	$client->enableProfiler();
    	$client->request('GET', 'blog/mostrar/'.$id);
    	if ( 200 == $client->getResponse()->getStatusCode() ){
    		return true;
    	}else{
    		return false;
    	}
    	 
    
    }
    
    
    
}
